package com.godofgamblers.hotelmanagementsystem.mapper;

import com.godofgamblers.hotelmanagementsystem.pojo.Room;
import com.godofgamblers.hotelmanagementsystem.pojo.RoomService;
import com.godofgamblers.hotelmanagementsystem.pojo.RoomType;
import com.godofgamblers.hotelmanagementsystem.pojo.RoomTypePicture;
import com.godofgamblers.hotelmanagementsystem.provider.RoomProvider;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface RoomMapper {
    //房间详情页面
    //通过房间类型id查询房间3张详图展示
    @Select("select * from room_type_picture where room_type_id=#{room_type_id}")
    public List<RoomTypePicture> findRoomPicByRtid(int room_type_id);

    //通过房间类型id查询房间名字，价格，库存,折扣等信息
    @Select("select * from  room_type where room_type_id=#{room_type_id}")
    public RoomType findRoomNameByRtid(int room_type_id);

    //通过房间类型id查询房间服务
    @Select("select * from  room_service where room_type_id=#{room_type_id}")
    public List<RoomService> findRoomServiceByRtid(int room_type_id);



    /**
     * 查询:
     * 查询所有的room
     *
     * @return room集合
     */
    @Select("select * from room,room_type where room.room_type_id=room_type.room_type_id and room.flag = 1")
    public List<Room> showAllItem();

    /**
     * 查询:
     * 通过room对象中的room_num属性值查询room表中包含该字段的 且flag为1的数据，封装为Room类型的对象
     *
     * @return Room类型的POJO对象
     */
    @Select("select * from room,room_type where room.room_type_id=room_type.room_type_id and room.room_num = #{room_num} and room.flag = 1")
    public Room showItemByNum(Room room);

    /**
     * 查询:
     * 通过room对象中的room_num属性值查询room表中包含该字段的 且flag为1的数据，封装为Room类型的对象
     *
     * @return Room类型的POJO对象
     */
    @Select("select * from room,room_type where room.room_type_id=room_type.room_type_id and room.room_id = #{room_id} and room.flag = 1")
    public Room showItemById(Room room);


    /**
     * 查询:忽略flag
     * 通过room对象中的room_num属性值查询room表中包含该字段的 且flag为1的数据，封装为Room类型的对象
     *
     * @return Room类型的POJO对象
     */
    @Select("select * from room,room_type where room.room_type_id=room_type.room_type_id and room.room_num = #{room_num}")
    public Room showItemByNumIgnoreFlag(Room room);

    /**
     * 查询:
     * 查询所有指定房间类型的room   返回room集合
     *
     * @return room集合
     */
    @Select("select * from room,room_type where room.room_type_id=room_type.room_type_id and room.room_type_id = #{room_type_id} and room.flag = 1")
    public List<Room> showItemsByType(Room room);

    /**
     * 查询:
     * 查询所有指定房间类型以及num的room   返回room集合
     *
     * @return room集合
     */
    @Select("select * from room,room_type where room.room_type_id=room_type.room_type_id and room.room_type_id = #{room_type_id} and room.room_num = #{room_num} and room.flag = 1")
    public List<Room> showItemsByTypeAndNum(Room room);

    /**
     * 修改
     * 根据room对象中的属性id确定修改数据行，根据room对象中state值update该条数据中room的状态值state
     *
     * @param room room pojo类对象
     */
    @Update("update room set room_state=#{room_state} where room_id = #{room_id}")
    public void changeState(Room room);

    /**
     * 修改
     * 根据room对象中的属性NUm确定修改数据行，根据room对象中state值update该条数据中room的状态值state
     *
     * @param room room pojo类对象
     */
    @Update("update room set room_state=#{room_state} where room_num = #{room_num}")
    public void changeStateByNum(Room room);

    /**
     * 修改
     * 根据room对象中的属性id确定修改数据行，根据room对象中room_type_id值update该条数据中room的类型idroom_type_id
     *
     * @param room room pojo类对象
     */
    @Update("update room set room_type_id=#{room_type_id} where room_id = #{room_id}")
    public void changeType(Room room);

    /**
     * 新增：
     * <p>
     * 根据room对象中的属性值创建新的room信息
     * <p>
     * 注意：
     * 新增前判断   当前表中是否存在意向新增的房间号  如果没有则执行此新增操作
     *
     * @param room
     */
    @Insert("insert into room(room_num,room_type_id) values(#{room_num},#{room_type_id})")
    public void insertItem(Room room);

    /**
     * 新增：
     * 注意：
     * 此操作为表中已经存在状态为软删除的数据行的房间num 与 意向创建的房间num相同的情况下，直接执行修改room_type_id 以及flag软删除状态的操作  等同新增
     *
     * @param room
     */
    @Insert("update room set room_type_id = #{room_type_id},flag=1 where room_num = #{room_num}")
    public void insertItemByUpdate(Room room);

    /**
     * 删除：
     * 软删除：实际为软删除  并不是真的删除
     * 根据id改变对应数据行的flag状态
     * <p>
     * 注意：
     * 在新增时判断  新增房间号是否存在于表中， 如果存在  就改变除房间号num之外的字段数据 以及flag
     *
     * @param room
     */
    @Delete("update room set flag=0 where room_id = #{room_id}")
    public void deleteItem(Room room);


    /**
     * 查找房间信息
     * @param room 传入房间类型、状态
     * @return List<Room>
     */
    @SelectProvider(method = "findroomsByRoom_typeAndRoomState",type = RoomProvider.class)
    public List<Room> findroomsByRoom_typeAndRoomState(Room room);

    /**
     *  线下开单修改房间状态为1（入住）
     * @param room_num 房间编号
     * @return 影响行数
     */
    @Update("update room set room_state = 1 where room_num=#{room_num}")
    public int offlineUpdateRoomStateByRoomNum(String room_num);

    /**
     * 退房修改房间状态
     * @param room  房间编号
     * @return  影响行数
     */
    @Update("update room set room_state = #{room_state} where room_num=#{room_num}")
   public int checkOutupdateRoomState(Room room);

    /**
     * 根据房间号查询房间状态
     * @param room_num  房间号
     * @return  房间状态
     */
    @Select("select room_state from room where room_num=#{room_num} and flag = 1")
    Integer checkRoomstateByRoomNum(String room_num);
}
